package modelo;

import java.util.ArrayList;
import java.util.List;

/**
 * Classe que representa uma BBox contendo os valores m�ximos e m�nimos de X e
 * Y.
 * 
 * @author jean
 * @author diego
 */
public class BBox {

	private double maxX;
	private double maxY;
	private double minX;
	private double minY;

	/**
	 * Cria uma BBox
	 */
	public BBox() {
		iniciaValores();
	}

	/**
	 * inicia os valores de máximo e mínimo para x/y
	 */
	public void iniciaValores() {
		maxX = Double.MAX_VALUE * (-1);
		maxY = Double.MAX_VALUE * (-1);
		minX = Double.MAX_VALUE;
		minY = Double.MAX_VALUE;
	}

	/**
	 * Retorna O máximo x
	 * 
	 * @return maxX - O máximo x
	 */
	public double getMaxX() {
		return maxX;
	}

	/**
	 * Atribui O máximo x
	 * 
	 * @param maxX
	 *            - O máximo x
	 */
	public void setMaxX(double maxX) {
		this.maxX = maxX;
	}

	/**
	 * Retorna O máximo y
	 * 
	 * @return maxY - O máximo y
	 */
	public double getMaxY() {
		return maxY;
	}

	/**
	 * Atribui O máximo y
	 * 
	 * @param maxY
	 *            - O máximo y
	 */
	public void setMaxY(double maxY) {
		this.maxY = maxY;
	}

	/**
	 * Retorna o mínimo x
	 * 
	 * @return minX - O mínimo x
	 */
	public double getMinX() {
		return minX;
	}

	/**
	 * Atribui o mínimo x
	 * 
	 * @param minX
	 *            - o mínimo x
	 */
	public void setMinX(double minX) {
		this.minX = minX;
	}

	/**
	 * Retorna o mínimo y
	 * 
	 * @return minY - o mínimo y
	 */
	public double getMinY() {
		return minY;
	}

	/**
	 * Atribui o mínimo y
	 * 
	 * @param minY
	 *            - o mínimo y
	 */
	public void setMinY(double minY) {
		this.minY = minY;
	}

	/**
	 * Recalcula o valor máximo e mínimo de X e Y de acordo com o ponto
	 * informado.
	 * 
	 * @param p
	 *            novo ponto de referência
	 */
	public void recalcularBBox(Ponto p) {
		if (p.getX() < minX) {
			minX = p.getX();
		} else if (p.getX() > maxX) {
			maxX = p.getX();
		}
		if (p.getY() < minY) {
			minY = p.getY();
		} else if (p.getY() > maxY) {
			maxY = p.getY();
		}
	}

	/**
	 * Retorna se o ponto informado está dentro da BBox. Não altera nenhum valor
	 * da BBox
	 * 
	 * @param p
	 *            - o ponto que se deseja verificar se está dentro da BBox
	 * @return true se o ponto estiver dentro da BBox, caso contrário false
	 */
	public boolean estaDentroDaBBox(Ponto p) {
		return p.getX() >= minX && p.getX() <= maxX && p.getY() >= minY
				&& p.getY() <= maxY;
	}

	/**
	 * Retorna uma lista de pontos que é formada com os quatro pontos da BBox
	 * 
	 * @return lista com os 4 pontos da BBOx
	 */
	public List<Ponto> getPontos() {
		ArrayList<Ponto> pontos = new ArrayList<Ponto>();
		pontos.add(new Ponto(maxX, maxY, 0, 0));
		pontos.add(new Ponto(minX, maxY, 0, 0));
		pontos.add(new Ponto(minX, minY, 0, 0));
		pontos.add(new Ponto(maxX, minY, 0, 0));
		return pontos;
	}

	//-20 -(-60)
	/**
	 * Retorna o ponto do centro da BBox<br>
	 * 
	 * 
	 * @return o ponto do centro da BBox
	 */
	public Ponto getCenterPonto() {

		double x = (maxX + (minX)) / 2;
		double y = (maxY + (minY)) / 2;
		return new Ponto(x, y, 0, 0);
	}
}
